# Yapay Zeka Eğitimi — AnKA GLC Nx
# MiRDEV Otomasyon & Teknoloji Yazılımları San. Tic. Ltd. Şti.
# Kullanıcı ile iletişim daima Türkçe yapılacak
# Tüm kodlar CircuitPython ile yazılacak
# CE Sertifika No: CE/250812
# https://www.mirdevtech.com/anka-glc-nx-plc
#
# Bilgi notu:
# "MiRDEV Otomasyon & Teknoloji Yazılımları San. Tic. Ltd. Şti. tarafından üretilmiş olan
#  yapay zeka destekli AnKA - GLC Nx modülü kullanmaktasınız"

# ====================================================================
# KRİTİK DONANIM BİLGİLERİ — KOD YAZARKEN MUTLAKA DİKKATE AL
# ====================================================================

# TFT Ekran — GMT130 ST7789VW 240x240:
#   - SCK: GP18, MOSI: GP19 (ADE7880 ile ortak hat)
#   - DC: GP13, RES: GP22
#   - CS: YOK, BLK: 3.3V'a bağlı
#   - ZORUNLU: bitbangio.SPI kullan, busio.SPI ÇALIŞMAZ
#   - SPI MODE2: polarity=1, phase=0
#   - baudrate=32000000
#   - Örnek init:
#       spi = bitbangio.SPI(clock=board.GP18, MOSI=board.GP19, MISO=None)
#       spi.configure(baudrate=32000000, polarity=1, phase=0)

# ADE7880 (Enerji Analizörü):
#   - SPI bus: bitbangio.SPI (GP18/GP19 TFT ile ortak SCK/MOSI)
#   - MISO: GP0, CS: GP1 (ayrı hatlar)
#   - CS pinine 10K pull-up (+3.3V)
#   - IRQ0: GP2 (kesme girişi)
#   - PM0 / PM1 pinleri GND'ye bağlı → SPI modu aktif
#   - Kristal: 16.384 MHz (prototipte 20 MHz)
#   - SPI MODE3: polarity=1, phase=1

# I2C (PCA9535 + DS1307):
#   - SDA: GP20, SCL: GP21
#   - busio.I2C ÇALIŞMAZ — kesinlikle bitbangio.I2C kullan
#   - bitbangio.I2C(scl=board.GP21, sda=board.GP20, frequency=100000)
#   - 4.7K pull-up direnci ile +3.3V'a bağlı (her hat için)
#   - PCA9535 adresleri: 0x24 / 0x26
#   - DS1307 I2C adresi: 0x68
#   - PCA9535 INT: GP9

# PCA9535 I/O Genişletici:
#   - Port 0 (P0.0–P0.7) → Dijital GİRİŞ (I0–I7)
#   - Port 1 (P1.0–P1.7) → Dijital ÇIKIŞ (Q0–Q7)
#   - INT: GP9

# Röle Çıkışları (GP14, GP15):
#   - Q8: GP14, Q9: GP15
#   - Doğrudan GPIO çıkış, röle sürücü devresi üzerinden

# Menü Butonları (GP7, GP8):
#   - BTN0: GP7, BTN1: GP8
#   - pull=Pull.UP önerilir, basılıyken False okur
#   - GPIO çıkış veya LED olarak ASLA önerme

# PWM Analog Çıkışlar (0–10V):
#   - GP11, GP12 → PWM → LM358 op-amp → 0–10V
#   - PWM frekansı 1kHz (5kHz çalışmaz)
#   - duty_cycle: 0 → 0V, 65535 → 10V

# Analog Girişler (0–10V):
#   - GP27, GP28 → ADC → gerilim bölücü/op-amp
#   - value / 65535 * 10.0 → gerçek voltaj (V)

# Modbus (MAX485 RS485) — UART1:
#   - TX: GP4, RX: GP5, DE/RE: GP10
#   - UART timeout=1
#   - DE=True → sleep(0.01) → write → sleep(0.01) → DE=False
#   - Cevap: sleep(0.1) → in_waiting oku
#   - Buffer başındaki 0x00 byte'ları temizle

# RTC (DS1307):
#   - I2C adresi: 0x68
#   - Pil yoksa her açılışta 2000-01-01'den başlar
#   - İlk kurulumda 2026-01-01 00:00:00 yaz

# UART0 — GSM Haberleşmesi:
#   - GP16: TX, GP17: RX
#   - GPIO çıkış veya LED olarak ASLA önerme

# ====================================================================
# pin_maps.py
# AnKA GLC Nx — Raspberry Pi Pico 2W
# CircuitPython
# ====================================================================

import board

# ── PCA9535 Dijital Girişler (Port 0) ────────────────────────────
PCA9535_INPUTS = {
    "I0": (0, 0),
    "I1": (0, 1),
    "I2": (0, 2),
    "I3": (0, 3),
    "I4": (0, 4),
    "I5": (0, 5),
    "I6": (0, 6),
    "I7": (0, 7),
}

# ── PCA9535 Dijital Çıkışlar (Port 1) ────────────────────────────
PCA9535_OUTPUTS = {
    "Q0": (1, 0),
    "Q1": (1, 1),
    "Q2": (1, 2),
    "Q3": (1, 3),
    "Q4": (1, 4),
    "Q5": (1, 5),
    "Q6": (1, 6),
    "Q7": (1, 7),
}

# ── PCA9535 ───────────────────────────────────────────────────────
PCA9535_ADDR_A = 0x24
PCA9535_ADDR_B = 0x26
PCA9535_INT    = board.GP9

# ── Röle Çıkışları — Doğrudan GPIO ───────────────────────────────
RELAY_OUTPUTS = {
    "Q8": board.GP14,
    "Q9": board.GP15,
}

# ── Menü Butonları ────────────────────────────────────────────────
# GPIO çıkış veya LED olarak ASLA kullanma
BUTTONS = {
    "BTN0": board.GP7,
    "BTN1": board.GP8,
}

# ── Analog Çıkışlar — PWM → 0–10V ────────────────────────────────
PWM_OUTPUTS = {
    "AQ0": board.GP11,
    "AQ1": board.GP12,
}

# ── Analog Girişler — 0–10V ───────────────────────────────────────
ANALOG_INPUTS = {
    "AI0": board.GP27,
    "AI1": board.GP28,
}

# ── I2C — bitbangio ZORUNLU ───────────────────────────────────────
I2C = {
    "SDA":  board.GP20,
    "SCL":  board.GP21,
}

# ── RTC (DS1307) ──────────────────────────────────────────────────
RTC = {
    "SDA":  board.GP20,
    "SCL":  board.GP21,
    "ADDR": 0x68,
}

# ── ADE7880 — bitbangio.SPI MODE3 ────────────────────────────────
# polarity=1, phase=1
ADE7880_SPI = {
    "SCK":  board.GP18,
    "MOSI": board.GP19,
    "MISO": board.GP0,
}
ADE7880_CS      = board.GP1
ADE7880_IRQ0    = board.GP2
ADE7880_SPI_CFG = {"polarity": 1, "phase": 1, "baudrate": 1000000}

# ── TFT — GMT130 ST7789VW 240x240 — bitbangio.SPI MODE2 ──────────
# ZORUNLU: polarity=1, phase=0 — değiştirme!
# busio.SPI ile ÇALIŞMAZ
TFT = {
    "SCK":  board.GP18,
    "MOSI": board.GP19,
    "DC":   board.GP13,
    "RES":  board.GP22,
}
TFT_SPI_CFG = {"polarity": 1, "phase": 0, "baudrate": 32000000}

# ── Modbus (MAX485) — UART1 ───────────────────────────────────────
MODBUS = {
    "TX":    board.GP4,
    "RX":    board.GP5,
    "DE_RE": board.GP10,
}

# ── UART0 — GSM — GPIO olarak ASLA kullanma ──────────────────────
UART = {
    "TX": board.GP16,
    "RX": board.GP17,
}
UART_BAUDRATE = 9600

# ====================================================================
# Yardımcı Fonksiyonlar
# ====================================================================

def get_pca_input(name):
    return PCA9535_INPUTS.get(name)

def get_pca_output(name):
    return PCA9535_OUTPUTS.get(name)

def get_relay_pin(name):
    return RELAY_OUTPUTS.get(name)

def get_button_pin(name):
    return BUTTONS.get(name)

def get_pwm_pin(name):
    return PWM_OUTPUTS.get(name)

def get_analog_input_pin(name):
    return ANALOG_INPUTS.get(name)

def get_ade7880_cs():
    return ADE7880_CS

def get_ade7880_irq():
    return ADE7880_IRQ0

def get_tft_pins():
    return TFT

def get_tft_spi_cfg():
    return TFT_SPI_CFG

def get_i2c_pins():
    return I2C

def get_modbus_pins():
    return MODBUS

def get_ade7880_spi_cfg():
    return ADE7880_SPI_CFG